Amazon EFSでsetgid/スティッキービットを使う
Amazon Elastic File System (以下EFS)が最近になってsetgidとスティッキービットに対応しました。
これらを利用すると
- グループで共有するディレクトリ(setgid)
- /tmp のようなディレクトリ(スティッキービット)
を構築できるようになります。
以下ではでこのようなディレクトリを実際に作ってみます。
検証環境
- リージョン : eu-central-1(Frankfurt)
- OS : Amazon Linux AMI 2017.03
- EFS : 2017/09/15 時点
EC2インスタンスに検証用EFSをマウント
EFS ユーザーガイドの Getting Started に従って操作して下さい。
今回はEFSを作成後、次のようにマウントしました
$ sudo mkdir /mnt/test $ sudo mount -t nfs4 -o nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2 XXX.efs.eu-central-1.amazonaws.com:/ /mnt/test $ cd /mnt/test/
検証用ユーザー・グループを作成
事前準備として新規にユーザー・グループを作成します。
新規ユーザーを追加
新規ユーザー"mike"を追加します
$ sudo useradd -c "Mike Smith" mike $ sudo passwd mike
新規グループを追加
新規グループ"web-group"を追加します
$ sudo groupadd web-group $ grep web-group /etc/group web-group:502:
ユーザー
- ec2-user
- mike
をこのグループに所属させます。
$ sudo usermod -a -G web-group mike $ sudo usermod -a -G web-group ec2-user $ grep web-group /etc/group web-group:502:mike,ec2-user $ id ec2-user uid=500(ec2-user) gid=500(ec2-user) groups=500(ec2-user),10(wheel),502(web-group) $ id mike uid=501(mike) gid=501(mike) groups=501(mike),502(web-group)
setgidを利用してグループで共有するディレクトリを作成する
ディレクトリにsetgidを設定すると、そのディレクトリ配下に作成されたファイル・ディレクトリの所有グループはsetgidを設定したディレクトリと同じになります。 そのため、グループで共有するディレクトリに活用出来ます。
共有用ディレクトリの作成
$ cd /mnt/test/ $ sudo mkdir setgid-dir $ sudo mkdir -m 2775 setgid-dir $ sudo chgrp web-group setgid-dir $ ls -l total 4 drwxrwsr-x 2 root web-group 6144 Sep 10 09:57 setgid-dir
ec2-user
ユーザーで setgid-dir
ディレクトリ以下でファイル・ディレクトリを作成します。
$ whoami ec2-user $ cd /mnt/test/setgid-dir $ mkdir a $ touch b $ ls -l total 8 drwxrwsr-x 2 ec2-user web-group 6144 Sep 10 10:00 a -rw-rw-r-- 1 ec2-user web-group 0 Sep 10 10:00 b
共有ディレクトリなので、同じグループ(web-group
)に所属するmikeもファイル・ディレクトリの更新が可能です
$ sudo su - mike $ whoami mike $ mv a foo $ mkdir foo/baz $ ls -l foo/ total 4 drwxrwsr-x 2 mike web-group 6144 Sep 10 10:01 baz
パーミッション(drwxrwsr-x
)のグループ部(rws
)の最後が"s"になっていることから、setgidビットが立っていることがわかります。
スティッキービットを利用して /tmp のようなディレクトリを作成する
/tmp ディレクトリ以下では各ユーザーがファイル/ディレクトリを作成可能ですが、それらを削除できるのは(rootユーザーを除き)所有ユーザーだけです。 ディレクトリにスティッキービットを設定すると、このようなディレクトリを作成出来ます。
/tmp風ディレクトリの作成
$ cd /mnt/test/ $ sudo mkdir sticky-dir $ sudo mkdir -m 1775 sticky-dir $ sudo chgrp web-group sticky-dir $ ls -l total 4 drwxrwxr-t 2 root web-group 6144 Sep 10 09:57 sticky-dir
パーミッション(drwxrwxr-t
)の最後が"t"になっていることから、スティッキービットが立っていることがわかります。
ec2-user
ユーザーで sticky-dir
ディレクトリ以下でファイル・ディレクトリを作成します。
$ whoami ec2-user $ cd /mnt/test/sticky-dir $ mkdir a $ touch b $ ls -l total 4 drwxrwxr-x 2 ec2-user ec2-user 6144 Sep 10 10:02 a -rw-rw-r-- 1 ec2-user ec2-user 0 Sep 10 10:02 b
他のユーザーが作成したファイル・ディレクトリの変更操作はできませんが、同じ階層に自分が所有するファイル・ディレクトリの作成は可能です
$ sudo su - mike $ whoami mike $ mv a foo mv: cannot move ‘a’ to ‘foo’: Operation not permitted $ mkdir foo $ touch bar $ ls -l total 8 drwxrwxr-x 2 ec2-user ec2-user 6144 Sep 10 10:02 a -rw-rw-r-- 1 ec2-user ec2-user 0 Sep 10 10:02 b -rw-rw-r-- 1 mike mike 0 Sep 10 10:09 bar drwxrwxr-x 2 mike mike 6144 Sep 10 10:09 foo
まとめ
Amazon EFS を利用して
- グループで共有するディレクトリ(setgid)
- /tmp のようなディレクトリ(スティッキービット)
を作成しました。
アクセス権限周りの地味のアップデートにより、EFS のユースケースが増えました。
参考
- Linuxプログラミングインタフェース:15章 ファイルの属性
- Amazon EFS now Supports Additional Permissions for Finer-Grained Control of Directory and File Access
- https://en.wikipedia.org/wiki/Setuid
- https://en.wikipedia.org/wiki/Sticky_bit